package com.road.vast.springboot;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.apache.commons.io.IOUtils;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @Author 郭泽鹏
 * @Date 2020/6/25 14:01
 * @Version 1.0
 * @Description
 *  需求：
 *      1.从activiti的 act_ge_bytearray 表中读取两个资源文件
 *      2.将两个资源文件保存到路径：D:\IDEA\spring-boot-activiti\src\main\resources\from-database 下
 *
 *  技术方案：
 *      1.第一种方式：使用activiti的api方式实现
 *      2.第二种方式：用原理层面，可以使用jdbc的对blob类型，clob类型数据的读取和保存
 *          IO流转换：使用commons-io.jar包可以轻松解决IO操作
 *
 *  真实应用场景：用户想看这个请假流程具体有哪些步骤要走
 */
public class BpmnFileQuery {
    public static void main(String[] args) throws IOException {
        //1、创建ProcessEngine对象
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        //2、创建RepositoryService对象
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        //3、创建流程定义查询器
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();

        //4、设置查询条件
        processDefinitionQuery.processDefinitionKey("holiday");//流程定义的key

        //5、执行查询操作，查询出想要的流程定义
        List<ProcessDefinition> list = processDefinitionQuery.list();

        InputStream pngIs = null;
        InputStream bpmnIs = null;
        FileOutputStream pngOs = null;
        FileOutputStream bpmnOs = null;
        for (ProcessDefinition processDefinition : list) {
            //6、通过流程定义信息得到部署ID
            String deploymentId = processDefinition.getDeploymentId();

            //7、通过repositoryService的方法，实现读取图片信息及bpmn文件信息（输入流）
            //getResourceAsStream:第一个参数代表流程部署id，第二个参数代表资源名称
            //processDefinition.getDiagramResourceName()：代表获取png图片资源的名称
            //processDefinition.getResourceName()：代表获取bpmn文件的名称
            pngIs = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
            bpmnIs = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());

            //8、构建出outputStream流    参数：filePath
            pngOs = new FileOutputStream("D:\\IDEA\\spring-boot-activiti\\src\\main\\resources\\from-database\\" + processDefinition.getDiagramResourceName());
            bpmnOs = new FileOutputStream("D:\\IDEA\\spring-boot-activiti\\src\\main\\resources\\from-database\\" + processDefinition.getResourceName());

            //9、输入流和输出流之间的转换    commons-io包
            IOUtils.copy(pngIs, pngOs);
            IOUtils.copy(bpmnIs, bpmnOs);
        }

        //10、关闭流
        pngOs.close();
        bpmnOs.close();
        pngIs.close();
        bpmnIs.close();
    }
}
